package nc;

import java.util.Scanner;

/**
 * 请编写一个函数（允许增加子函数），计算n x m的棋盘格子（n为横向的格子数，m为竖向的格子数）沿着各自边缘线从左上角走到右下角，总共有多少种走法，要求不能走回头路，即：只能往右和往下走，不能往左和往上走。
 */
public class Q21314 {

    public static int steps2(int n,int m) {
        // 非递归法
        // n要比m大
        if (n < m) {
            int temp = m;
            m = n;
            n = temp;
        }
        int[][] dp = new int[n+1][];
        for (int i = 0; i < n+1; i++) {
            dp[i] = new int[n+1];
        }
        // 所有的边都设置为1
        for (int i = 0; i < n + 1; i++) {
            dp[i][0] = 1;
            dp[0][i] = 1;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m && j <= i; j++) {// 这样循环次数并未减少，但其实是能减少的，比如设计j比i小
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
                dp[j][i] = dp[i][j];
            }
        }
        return dp[n][m];
    }

    public static int steps(int n,int m) {
        if (n==1 && m == 1) {
            return 2;
        }
        if (n ==0 || m ==0) {
            return 1;
        }
        return steps(n-1,m) + steps(n,m-1);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            System.out.println(steps2(n,m));
        }
    }

}
